/*
 * BasicaDAO.java
 *
 * Created on 30 de octubre de 2006, 05:43 PM
 *
 * To change this template, choose Tools | Options and locate the template under
 * the Source Creation and Management node. Right-click the template and choose
 * Open. You can then make changes to the template in the Source Editor.
 */

package com.src.computec.radar.consultas.basica.dao;

import com.src.computec.radar.base.dao.GenericDAO;
import com.src.computec.radar.base.dao.exception.DAOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import static com.src.computec.radar.consultas.base.constantes.ConstantesGenerales.SCHEMA;
import com.src.computec.radar.consultas.source.ConsultasSource;
import com.src.computec.radar.services.utilities.dto.EnvioDto;
import com.src.computec.radar.services.utilities.dto.ParametroBusquedaDto;
import java.math.BigInteger;


/**
 *
 * @author aocampo
 */
public class BasicaDAO extends GenericDAO implements BaseBasicaDAO {
    
    /** Creates a new instance of BasicaDAO */
    public BasicaDAO() {
    }
    
    private boolean isNumber(String token) {
        try {
            BigInteger bigInteger = new BigInteger(token);
            return true;
        }
        catch(NumberFormatException nfe) {
            return false;
        }
    }
    
    public List getEnviosByParametroBusqueda(ParametroBusquedaDto dto) throws DAOException {
        List listEnvios = new ArrayList();
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        String anoFilter = "";
        if(dto.getAnoProceso() != null && !dto.getAnoProceso().equals("")) {
            anoFilter = "AND YEAR(OP.FECHA_PROCESO) = " + dto.getAnoProceso() + " ";
        }
        String busqueda = dto.getBusqueda();
        try {
            con = getConnectionDB2();
            int indice = 0;
            if (!dto.getCodigoProducto().equals("-1")) {
                statement = con.prepareStatement("SELECT E.CODIGO_BARRAS, E.CODIGO_CLIENTE, E.CODIGO_PRODUCTO, E.CODIGO_NODO, E.CODIGO_TIPO_IDENTIFICACION, E.NUMERO_IDENTIFICACION, E.NOMBRE_DESTINATARIO, " +
                                                 "E.DIRECCION_DESTINATARIO, E.TELEFONO_DESTINATARIO, E.BARRIO_DESTINATARIO, E.CODIGO_TIPO_ENVIO, E.CODIGO_ULTIMA_GESTION, E.PATH_IMAGEN, TE.NOMBRE_TIPO_ENVIO, " +
                                                 "GE.NOMBRE_GESTION, OP.FECHA_PROCESO, ND.CODIGO_PROVEEDOR, PR.RAZON_SOCIAL, E.CODIGO_DEPARTAMENTO, E.CODIGO_MUNICIPIO, E.CODIGO_CENTROP, DP.NOMBRE_DEPARTAMENTO, M.NOMBRE_MUNICIPIO, " +
                                                 "CP.NOMBRE_CENTRO_POBLADO, PR.PAGINA_WEB, OP.CICLO, OP.FECHA_CORTE_PROCESO, P.DESCRIPCION_PRODUCTO, E.FECHA_ULTIMA_GESTION, ND.NOMBRE_NODO " +
                                                 "FROM " + SCHEMA + ".ENVIO E " +
                                                 "INNER JOIN " + SCHEMA + ".DOCUMENTO D ON E.CODIGO_BARRAS = D.CODIGO_BARRAS " +
                                                 "INNER JOIN " + SCHEMA + ".TIPO_ENVIO TE ON E.CODIGO_TIPO_ENVIO = TE.CODIGO_TIPO_ENVIO " +
                                                 "INNER JOIN " + SCHEMA + ".GESTION_ENVIO GE ON E.CODIGO_ULTIMA_GESTION = GE.CODIGO_GESTION " +
                                                 "INNER JOIN " + SCHEMA + ".ORDEN_PROCESO_DETALLE OPD ON E.NUMERO_ORDEN = OPD.NUMERO_ORDEN AND E.CODIGO_NODO = OPD.CODIGO_NODO " +
                                                 "INNER JOIN " + SCHEMA + ".ORDEN_PROCESO OP ON OPD.NUMERO_ORDEN = OP.NUMERO_ORDEN " +
                                                 "INNER JOIN " + SCHEMA + ".NODO_DISTRIBUCION ND ON OPD.CODIGO_NODO = ND.CODIGO_NODO " +
                                                 "INNER JOIN " + SCHEMA + ".PROVEEDOR PR ON ND.CODIGO_PROVEEDOR = PR.CODIGO_PROVEEDOR " +
                                                 "INNER JOIN " + SCHEMA + ".DEPARTAMENTO DP ON E.CODIGO_DEPARTAMENTO = DP.CODIGO_DEPARTAMENTO " +
                                                 "INNER JOIN " + SCHEMA + ".MUNICIPIO M ON E.CODIGO_DEPARTAMENTO = M.CODIGO_DEPARTAMENTO AND E.CODIGO_MUNICIPIO = M.CODIGO_MUNICIPIO " +
                                                 "INNER JOIN " + SCHEMA + ".CENTRO_POBLADO CP ON E.CODIGO_DEPARTAMENTO = CP.CODIGO_DEPARTAMENTO AND E.CODIGO_MUNICIPIO = CP.CODIGO_MUNICIPIO AND E.CODIGO_CENTROP = CP.CODIGO_CENTROP " +
                                                 "INNER JOIN " + SCHEMA + ".PRODUCTO P ON E.CODIGO_PRODUCTO = P.CODIGO_PRODUCTO " +
                                                 "WHERE D." + dto.getNombreCampo() + " = ? AND E.CODIGO_CLIENTE = ? AND E.CODIGO_PRODUCTO = ? " + anoFilter +
                                                 "GROUP BY E.CODIGO_BARRAS, E.CODIGO_CLIENTE, E.CODIGO_PRODUCTO, E.CODIGO_NODO, E.CODIGO_TIPO_IDENTIFICACION, E.NUMERO_IDENTIFICACION, E.NOMBRE_DESTINATARIO, " +
                                                 "E.DIRECCION_DESTINATARIO, E.TELEFONO_DESTINATARIO, E.BARRIO_DESTINATARIO, E.CODIGO_TIPO_ENVIO, E.CODIGO_ULTIMA_GESTION, E.PATH_IMAGEN, TE.NOMBRE_TIPO_ENVIO, " +
                                                 "GE.NOMBRE_GESTION, OP.FECHA_PROCESO, ND.CODIGO_PROVEEDOR, PR.RAZON_SOCIAL, E.CODIGO_DEPARTAMENTO, E.CODIGO_MUNICIPIO, E.CODIGO_CENTROP, DP.NOMBRE_DEPARTAMENTO, M.NOMBRE_MUNICIPIO, " +
                                                 "CP.NOMBRE_CENTRO_POBLADO, PR.PAGINA_WEB, OP.CICLO, OP.FECHA_CORTE_PROCESO, P.DESCRIPCION_PRODUCTO, E.FECHA_ULTIMA_GESTION, ND.NOMBRE_NODO " +
                                                 "ORDER BY OP.FECHA_PROCESO DESC");
                statement.setString(++indice, dto.getBusqueda());
                statement.setObject(++indice, dto.getCodigoCliente());
                statement.setObject(++indice, dto.getCodigoProducto());
            }
            else {
                statement = con.prepareStatement("SELECT E.CODIGO_BARRAS, E.CODIGO_CLIENTE, E.CODIGO_PRODUCTO, E.CODIGO_NODO, E.CODIGO_TIPO_IDENTIFICACION, E.NUMERO_IDENTIFICACION, E.NOMBRE_DESTINATARIO, " +
                                                 "E.DIRECCION_DESTINATARIO, E.TELEFONO_DESTINATARIO, E.BARRIO_DESTINATARIO, E.CODIGO_TIPO_ENVIO, E.CODIGO_ULTIMA_GESTION, E.PATH_IMAGEN, TE.NOMBRE_TIPO_ENVIO, " +
                                                 "GE.NOMBRE_GESTION, OP.FECHA_PROCESO, ND.CODIGO_PROVEEDOR, PR.RAZON_SOCIAL, E.CODIGO_DEPARTAMENTO, E.CODIGO_MUNICIPIO, E.CODIGO_CENTROP, DP.NOMBRE_DEPARTAMENTO, M.NOMBRE_MUNICIPIO, " +
                                                 "CP.NOMBRE_CENTRO_POBLADO, PR.PAGINA_WEB, OP.CICLO, OP.FECHA_CORTE_PROCESO, P.DESCRIPCION_PRODUCTO, E.FECHA_ULTIMA_GESTION, ND.NOMBRE_NODO " +
                                                 "FROM " + SCHEMA + ".ENVIO E " +
                                                 "INNER JOIN " + SCHEMA + ".DOCUMENTO D ON E.CODIGO_BARRAS = D.CODIGO_BARRAS " +
                                                 "INNER JOIN " + SCHEMA + ".TIPO_ENVIO TE ON E.CODIGO_TIPO_ENVIO = TE.CODIGO_TIPO_ENVIO " +
                                                 "INNER JOIN " + SCHEMA + ".GESTION_ENVIO GE ON E.CODIGO_ULTIMA_GESTION = GE.CODIGO_GESTION " +
                                                 "INNER JOIN " + SCHEMA + ".ORDEN_PROCESO_DETALLE OPD ON E.NUMERO_ORDEN = OPD.NUMERO_ORDEN AND E.CODIGO_NODO = OPD.CODIGO_NODO " +
                                                 "INNER JOIN " + SCHEMA + ".ORDEN_PROCESO OP ON OPD.NUMERO_ORDEN = OP.NUMERO_ORDEN " +
                                                 "INNER JOIN " + SCHEMA + ".NODO_DISTRIBUCION ND ON OPD.CODIGO_NODO = ND.CODIGO_NODO " +
                                                 "INNER JOIN " + SCHEMA + ".PROVEEDOR PR ON ND.CODIGO_PROVEEDOR = PR.CODIGO_PROVEEDOR " +
                                                 "INNER JOIN " + SCHEMA + ".DEPARTAMENTO DP ON E.CODIGO_DEPARTAMENTO = DP.CODIGO_DEPARTAMENTO " +
                                                 "INNER JOIN " + SCHEMA + ".MUNICIPIO M ON E.CODIGO_DEPARTAMENTO = M.CODIGO_DEPARTAMENTO AND E.CODIGO_MUNICIPIO = M.CODIGO_MUNICIPIO " +
                                                 "INNER JOIN " + SCHEMA + ".CENTRO_POBLADO CP ON E.CODIGO_DEPARTAMENTO = CP.CODIGO_DEPARTAMENTO AND E.CODIGO_MUNICIPIO = CP.CODIGO_MUNICIPIO AND E.CODIGO_CENTROP = CP.CODIGO_CENTROP " +
                                                 "INNER JOIN " + SCHEMA + ".PRODUCTO P ON E.CODIGO_PRODUCTO = P.CODIGO_PRODUCTO " +
                                                 "WHERE D." + dto.getNombreCampo() + " = ? AND E.CODIGO_CLIENTE = ? " + anoFilter + 
                                                 "GROUP BY E.CODIGO_BARRAS, E.CODIGO_CLIENTE, E.CODIGO_PRODUCTO, E.CODIGO_NODO, E.CODIGO_TIPO_IDENTIFICACION, E.NUMERO_IDENTIFICACION, E.NOMBRE_DESTINATARIO, " +
                                                 "E.DIRECCION_DESTINATARIO, E.TELEFONO_DESTINATARIO, E.BARRIO_DESTINATARIO, E.CODIGO_TIPO_ENVIO, E.CODIGO_ULTIMA_GESTION, E.PATH_IMAGEN, TE.NOMBRE_TIPO_ENVIO, " +
                                                 "GE.NOMBRE_GESTION, OP.FECHA_PROCESO, ND.CODIGO_PROVEEDOR, PR.RAZON_SOCIAL, E.CODIGO_DEPARTAMENTO, E.CODIGO_MUNICIPIO, E.CODIGO_CENTROP, DP.NOMBRE_DEPARTAMENTO, M.NOMBRE_MUNICIPIO, " +
                                                 "CP.NOMBRE_CENTRO_POBLADO, PR.PAGINA_WEB, OP.CICLO, OP.FECHA_CORTE_PROCESO, P.DESCRIPCION_PRODUCTO, E.FECHA_ULTIMA_GESTION, ND.NOMBRE_NODO " +
                                                 "ORDER BY OP.FECHA_PROCESO DESC");
                statement.setString(++indice, dto.getBusqueda());
                statement.setObject(++indice, dto.getCodigoCliente());
            }
            rs = statement.executeQuery();
            while (rs.next()) {
                indice = 0;
                EnvioDto envioDto = new EnvioDto();
                envioDto.setCodigoBarras(rs.getString(++indice));
                envioDto.setCodigoCliente(rs.getString(++indice));
                envioDto.setCodigoProducto(rs.getString(++indice));
                envioDto.setCodigoNodo(rs.getString(++indice));
                envioDto.setCodigoTipoIdentificacion(rs.getString(++indice));
                envioDto.setNumeroIdentificacion(rs.getString(++indice));
                envioDto.setNombreDestinatario(rs.getString(++indice));
                envioDto.setDireccionDestinatario(rs.getString(++indice));
                envioDto.setTelefonoDestinatario(rs.getString(++indice));
                envioDto.setBarrioDestinatario(rs.getString(++indice));
                envioDto.setCodigoTipoEnvio(rs.getString(++indice));
                envioDto.setCodigoUltimaGestion(rs.getString(++indice));
                envioDto.setPathImagen(rs.getString(++indice));
                envioDto.setNombreTipoEnvio(rs.getString(++indice));
                envioDto.setNombreGestion(rs.getString(++indice));
                envioDto.setFechaProceso(rs.getDate(++indice));
                envioDto.setCodigoProveedor(rs.getString(++indice));
                envioDto.setRazonSocialProveedor(rs.getString(++indice));
                if (envioDto.getPathImagen() != null && !envioDto.getPathImagen().equals("")) {
                    envioDto.setHasPathImagen(true);
                }
                else {
                    envioDto.setHasPathImagen(false);
                }
                envioDto.setCodigoDepartamento(rs.getString(++indice));
                envioDto.setCodigoMunicipio(rs.getString(++indice));
                envioDto.setCodigoCentroPoblado(rs.getString(++indice));
                envioDto.setNombreDepartamento(rs.getString(++indice));
                envioDto.setNombreMunicipio(rs.getString(++indice));
                envioDto.setNombreCentroPoblado(rs.getString(++indice));
                envioDto.setPaginaWebProveedor(rs.getString(++indice));
                envioDto.setCiclo(rs.getString(++indice));
                envioDto.setFechaCorteProceso(rs.getDate(++indice));
                envioDto.setDescripcionProducto(rs.getString(++indice));
                if (!envioDto.getCodigoUltimaGestion().equals(ConsultasSource.getInstance().getConsultasSetupKey("codigoGestionDistribucionExterna")) && !envioDto.getCodigoProveedor().equals(ConsultasSource.getInstance().getConsultasSetupKey("codigoProveedorDistribucionExterna"))) {
                    envioDto.setGestionDistribucionExterna(false);
                }
                else {
                    envioDto.setGestionDistribucionExterna(true);
                }
                envioDto.setFechaUltimaGestion(rs.getDate(++indice));
                envioDto.setNombreNodo(rs.getString(++indice));
                listEnvios.add(envioDto);
            }
        } 
        catch (SQLException e) {
            throw new DAOException("BasicaDAO:getEnviosByParametroBusqueda:" + e.toString(), e);
        }
        finally {
            closeConnection(con, statement, rs);
        }
        return listEnvios;
    }
}